#pragma once

#include <gofcl_usbfs_ep_r.h>

typedef struct {
	u32_s MPL : 11;
	u32_s : 4;
	u32_s EPACT : 1;
	u32_s EOFRM_DPID : 1;
	u32_s NAKS : 1;
	u32_s EPTYPE : 2;
	u32_s SNOOP : 1;
	u32_s STALL : 1;
	u32_s TXFNUM : 4;
	u32_s CNAK : 1;
	u32_s SNAK : 1;
	u32_s SEVENFRM_SD0PID : 1;
	u32_s SODDFRM_SD1PID : 1;
	u32_s EPD : 1;
	u32_s EPEN : 1;
} usbfs_depctl_s;

_Static_assert(sizeof(usbfs_depctl_s) == 4,
	       "Struct usbfs_depctl_s defined error!");

static inline void usbfs_wreg_depctl_s(usbfs_ep_re io_r, usbfs_ep_rre ep_rr,
				       usbfs_depctl_s depctl) {
	union {
		usbfs_depctl_s d;
		u32_s u;
	} du = {
		.d = depctl,
	};
	usbfs_wreg_ep(io_r, ep_rr, USBFS_EP_CTL, du.u);
}

static inline usbfs_depctl_s usbfs_rreg_depctl_s(usbfs_ep_re io_r,
						 usbfs_ep_rre ep_rr) {
	union {
		usbfs_depctl_s d;
		u32_s u;
	} du = {
		.u = usbfs_rreg_ep(io_r, ep_rr, USBFS_EP_CTL),
	};
	return du.d;
}
